今天我們主要要來介紹圖片隱寫術跟如何使用十六進位編輯器!
但在對圖片隱藏我們的訊息以前,我們先來講一些基礎知識
副檔名 | File signatures |
---|---|
jpg, jpeg | FF D8 FF E0 |
png | 89 50 4E 47 0D 0A 1A 0A |
gif | 47 49 46 38 37 61 47 49 46 38 39 61 |
25 50 44 46 |
點陣圖 | 向量圖 | |
---|---|---|
定義 | 由 Pixel 組成,每個 Pixel 都有顏色值 | 由數學公式和幾何元素(例如線條、曲線、多邊形)組成,使用數學方程式描述 |
縮放 | 放大可能失真,出現像素化 | 可以縮放而不失真 |
檔案大小 | 較大,尤其高解析度圖像 | 較小,不受解析度影響 |
常見檔案格式 | JPEG、PNG、GIF | SVG、AI、PDF |
Header + Data Chunk + ... + Data Chunk
每個 Data Chunk 都由四個部分組成
名稱 | Byte | 說明 |
---|
長度(Length)| 4 byte |指定數據塊中數據區域的長度,長度不可超過(231-1)個位元組
數據塊類型碼(Chunk Type Code)| 4 byte |數據塊類型碼由ASCII字母(A-Z和a-z) 組成的"數據塊符號"
數據塊數據(Chunk Data)| 可變長度| 儲存數據塊類型碼指定的數據
循環冗餘檢測(CRC) |4 byte| 儲存用來檢測是否檔案傳輸有誤的循環冗餘碼
有四個標準資料塊
基本資訊 | Byte | cat.png 範例 |
---|---|---|
IHDR | 4 byte | 49 48 44 52 |
寬度 Width | 4 byte | 00 00 02 6A |
高度 Height | 4 byte | 00 00 02 55 |
bit深度 Bit depth | 1 byte | 08 |
顏色類型 Color type | 1 byte | 06 ( rgba 模式 ) |
壓縮方法 Compression method | 1 byte | 00 (DEFLATE壓縮) |
過濾方法 Filter method | 1 byte | 00 (adaptive filtering with five basic filter types) |
隔行掃描方法 Interlace method | 1 byte | 00 (No Interlace) |
下載完圖片之後會發現打不開圖片
用 010 Editor 來看看
圖片最前面的 File signatures 好像少了一塊 >> 把 89 50 4E 47 補上去
010 Editor 插入 bytes :
左上角Edit >> Insert / Overwrite >> Insert Bytes
選擇插入位置 & 插入多少 bytes >> Insert
修改完會看到這樣的圖片
重新用 010 Editor 打開來看看
Kali 中是打不开这张图片的,提示 IHDR CRC error
chunk[0] ( IHDR ) 的區塊好像被修改過了 >> 圖片寬度改變才使照片變模糊
用python 爆破寬度
import os
import binascii
import struct
img = open("Lab.png","rb").read()
for i in range(1024):
data = img[12:16] + struct.pack('>i',i)+ img[20:29]
crc32 = binascii.crc32(data) & 0xffffffff
if crc32 == 0xd40238c8:
print(i)
找到寬度是600,再去修改就可以看到圖片了
http://www.libpng.org/pub/png/spec/1.2/PNG-Chunks.html
https://wooyun.js.org/drops/%E9%9A%90%E5%86%99%E6%9C%AF%E6%80%BB%E7%BB%93.html
https://ctf-wiki.org/
https://zh.wikipedia.org/zh-tw/PNG
https://zh.wikipedia.org/zh-tw/JPEG